[HBase]09 Phoenix二级索引 九

覆盖索引、函数索引、可变索引与不可变索引、同步索引与异步索引

Posted by 李玉坤 on 2017-10-17

覆盖索引

语法:

1
2
3
4
5
创建索引
CREATE INDEX my_index ON my_schema.my_table(sex,date) INCLUDE(col4);

删除索引
DROP INDEX my_index ON my_schema.my_table;

本质:
原始列的数据也存在index table。
这样查询索引数据时 不需要去原始表查询,直接获取结果,节省开销。

好处 :空间换时间 查询快
坏处: 存储空间浪费

1
2
3
4
5
6
7
8
9
10
11
12
13
全表扫描 all:
走数据表:explain select * from my_schema.my_table;
走数据表:explain select /*+ INDEX(my_schema.my_table my_index) */ * from my_schema.my_table;

走index表:explain select col4 from my_schema.my_table where sex=1;

走数据表:explain select date,col5,sex from my_schema.my_table where sex=1;


强制走index
走index表:explain select /*+ INDEX(my_schema.my_table my_index) */ col5 from my_schema.my_table where sex=1;

走数据表:explain select /*+ INDEX(my_schema.my_table my_index) */ col5 from my_schema.my_table ;

函数索引

其索引不局限于列,可以合适任意的表达式来创建索引,当在查询时用到了这些表达式时就直接返回表达式结果

1
2
3
4
5
6
使用UPPER函数创建函数索引使查询出的USERID和URL里字母都是大写的

创建函数索引
CREATE INDEX UPPER_NAME_IDX ON EMP (UPPER(FIRST_NAME||' '||LAST_NAME))
查询
SELECT EMP_ID FROM EMP WHERE UPPER(FIRST_NAME||' '||LAST_NAME)='JOHN DOE'

可变索引

前面所有的表和索引都是可变索引

基于表属性设置可变 index默认就是 可变

不可变索引

基于表属性设置不可变 index默认就是不可变
append 这种场景是业务表-登录log日志表

建表这个参数【IMMUTABLE_ROWS】平时不要加

1
2
3
4
5
6
7
8
9
--不可变的预分区表
create table my_table
(id integer primary key,
name varchar,
age integer,
address varchar) IMMUTABLE_ROWS=TRUE split on (1, 2, 3);

--创建不可变索引
CREATE INDEX my_index ON my_table(name,age) include(address);

同步索引

前面所讲的的index 都是同步索引,数据稳稳的同步过来

异步索引

一次性导入海量数据 就使用异步

如果项目落地了,两年后又有一个很大的表进phoenix 解决方法如下:
http://phoenix.apache.org/bulk_dataload.html

接下来数据导入完毕后就用到了构建异步索引

1
2
3
4
5
6
7
8
9
10
建表语法就是在普通索引语法后面加一个 ASYNC 【不会促发构建索引机制】
CREATE INDEX async_index ON my_schema.my_table (v) ASYNC

开始 构建异步索引
${HBASE_HOME}/bin/hbase
org.apache.phoenix.mapreduce.index.IndexTool
--schema MY_SCHEMA
--data-table MY_TABLE
--index-table ASYNC_IDX
--output-path ASYNC_IDX_HFILES

索引的优化

以下属性都必须在各节点上的hbase-site.xml中设置为true才能起效,
1.index.builder.threads.max:(默认值:10)
根据主表的更新来确定更新索引表的线程数

2.index.builder.threads.keepalivetime:(默认值:60)
builder线程池中线程的存活时间

3.index.write.threads.max:(默认值:10)
更新索引表时所能使用的线程数(即同时能更新多少张索引表),其数量最好与索引表的数量一致

4.index.write.threads.keepalivetime(默认值:60)
更新索引表的线程所能存活的时间

5.hbase.htable.threads.max(默认值:2147483647)
每张索引表所能使用的线程(即在一张索引表中同时可以有多少线程对其进行写入更新),增加此值可以提高更新索引的并发量

6.hbase.htable.threads.keepalivetime(默认值:60)
索引表上更新索引的线程的存活时间

7.index.tablefactoy.cache.size(默认值:10)
允许缓存的索引表的数量
增加此值,可以在更新索引表时不用每次都去重复的创建htable,由于是缓存在内存中,所以其值越大,其需要的内存越多